// 对axios进行封装,每次请求都会进行拦截

//书写拦截器
import axios from "axios"
import Vue from 'vue';
import { Toast } from 'vant';

Vue.use(Toast);

//创建axios实例
const instance = axios.create({
    // 请求的前缀抽取到baseURL
    baseURL:"http://kumanxuan1.f3322.net:8001",
    // 请求时间5s,超过则失败
    timeout:5000
})

//书写请求拦截器
instance.interceptors.request.use(config=>{//config本次请求的基本信息
    // 这个函数什么时候执行?这个函数在请求发出去之前就执行，拦截了这次请求
    // console.log("每一次发起请求前，都会先执行这里的代码");
    // console.log("执行请求拦截器",config);
    
    //在这个方法中检测，有没有token,如果有就在请求头中携带上这个token
    let token = localStorage.getItem("token");
    if(token){
        //如果有token就在请求头中携带上这个token
        config.headers["X-Nideshop-Token"] = token
    }
    // 加载提示
    Toast.loading({
      message: '加载中...',
      forbidClick: true,
    });
    
    return config
},err=>{
    return Promise.reject(err)
})

//响应拦截器
instance.interceptors.response.use(res=>{
    // 这个函数什么时候执行?在函数接收到响应之后，在执行组件中的then函数之前
    // console.log("每一次接收到响应，都会先执行这里的代码，再去执行成功的那个回调函数then");
    
    //统一管理错误提示
    //判断errno是不是不为0,如果不为0，就说明数据没有正常拿到直接log errmsg
    let data = res.data;
    if(data.errno !== 0){
        console.log("响应拦截器中",data.errmsg || "网络出错");
    }
    
    // 手动清除 Toast加载提示
    Toast.clear();
    
    return data //return后面的值返回到哪里?? return 后面的值被then方法的res接收了

},err=>{
    return Promise.reject(err)
})

// 导出实例
export default instance